package main

import (
	"fmt"
	"log"

	"ddl_checker/internal/parser"
)

func main() {
	fmt.Println("=== DDL混合解析器演示 ===")

	// 创建混合解析器
	p := parser.NewHybridAnalyzer()

	// 测试用例
	testCases := []string{
		// 简单的CREATE TABLE语句
		`CREATE TABLE users (
			id INT PRIMARY KEY,
			name VARCHAR(100) NOT NULL,
			email VARCHAR(255) UNIQUE
		);`,

		// 包含注释中分号的复杂DDL
		`CREATE TABLE lc.t_le_logistics_require_main (
			IS_DELETED VARCHAR(1)  COMMENT '是否删除：1-删除; 0-未删除',
			REMARK VARCHAR(1000)  COMMENT '备注; 包含分号的注释',
			GROUP_ID VARCHAR(64)  COMMENT '业务单据所属集团ID',
			le_logistics_require_main_id varchar(64) PRIMARY KEY COMMENT '需求 ID',
			approver_time timestamp comment '审核时间'
		) comment '物流需求主表';`,

		// 多条SQL语句
		`CREATE TABLE orders (
			id BIGINT PRIMARY KEY,
			user_id INT NOT NULL,
			product_name VARCHAR(255),
			quantity INT DEFAULT 1,
			price DECIMAL(10,2),
			created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
		);

		CREATE INDEX idx_orders_user_id ON orders(user_id);
		CREATE INDEX idx_orders_product_name ON orders(product_name);

		ALTER TABLE orders ADD COLUMN status VARCHAR(50) DEFAULT 'pending';`,

		// 包含字符串字面量的SQL
		`INSERT INTO logs (message) VALUES ('Error occurred; check logs;');
		UPDATE users SET status = 'active; confirmed' WHERE id = 1;`,

		// 包含特殊语法的SQL（测试后备解析器）
		`CREATE TABLE test_charset (
			id INT PRIMARY KEY,
			name VARCHAR(100) CHARSET utf8mb4
		) ENGINE=InnoDB;`,
	}

	for i, sql := range testCases {
		fmt.Printf("\n=== 测试案例 %d ===\n", i+1)
		fmt.Printf("原始SQL:\n%s\n", sql)
		fmt.Println("解析结果:")

		// 解析SQL
		statements, err := p.ParseBatchDDL(sql, ";")
		if err != nil {
			log.Printf("解析失败: %v", err)
			continue
		}

		fmt.Printf("成功解析 %d 条语句\n", len(statements))
		for j, stmt := range statements {
			fmt.Printf("  语句 %d:\n", j+1)
			fmt.Printf("    类型: %s\n", stmt.StatementType.String())
			fmt.Printf("    表名: %s\n", stmt.TableName)
			fmt.Printf("    使用解析器: %s\n", stmt.ParserUsed.String())
			fmt.Printf("    原始SQL: %s\n", stmt.OriginalSQL)
		}

		// 测试语句分割功能
		fmt.Println("\n语句分割测试:")
		splitStatements, err := p.SplitStatements(sql, ";")
		if err != nil {
			log.Printf("语句分割失败: %v", err)
			continue
		}

		fmt.Printf("分割为 %d 条语句:\n", len(splitStatements))
		for j, splitStmt := range splitStatements {
			fmt.Printf("  %d. %s\n", j+1, splitStmt)
		}
	}

	// 演示解析器容错能力
	fmt.Println("\n=== 解析器容错能力测试 ===")

	errorCases := []string{
		"INVALID SQL SYNTAX;",
		"",
		"SELECT * FROM table; -- 这是一个SELECT语句，不是DDL",
	}

	for i, sql := range errorCases {
		fmt.Printf("\n错误案例 %d: %s\n", i+1, sql)
		statements, err := p.ParseBatchDDL(sql, ";")
		if err != nil {
			fmt.Printf("  预期的错误: %v\n", err)
		} else {
			fmt.Printf("  意外成功，解析了 %d 条语句\n", len(statements))
			for j, stmt := range statements {
				fmt.Printf("    %d. %s (使用 %s 解析器)\n", j+1, stmt.StatementType.String(), stmt.ParserUsed.String())
			}
		}
	}
}
